#pragma hdrstop

#include "Globals.h"

#pragma package(smart_init)
#pragma resource "*.dfm"
TTileForm *TileForm;
//---------------------------------------------------------------------------
__fastcall TTileForm::TTileForm(TComponent* Owner)
    : TForm(Owner)
{
}


//////////////////////////////////
//                              //
//////////////////////////////////
void __fastcall TTileForm::FormMouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y)
{
  X >>= 4;
  Y >>= 4;

  if ( (X < 0 || Y < 0) || ( X >= 16 || Y >= 16) ) return;

  if ( Button == mbLeft )
  {
    if ( box.w > 1 || box.h > 1 )
    {
      box.w = box.h = 1;
      box.y = -1; box.x = -1;
      Form1->FormPaint( NULL );
    }

    cur_val = ((Y + til.ypos) << 4) + X;
    copy[Y][X] = cur_val;
    //
    if ( til.w > 1 || til.h > 1 )
    {
      for ( int y = 0; y < til.h; y++ )
      { // bounds checkin
        if ( (y + Y) >= 16 ) break;
        //
        for ( int x = 0; x < til.w; x++ )
        { //
          if ( (x + X) >= 16 ) break;
//          memcpyw(&CTIL[((y << 4) + x) << 6], &MENU[cur_tle][( ((Y + y) << 4) + (X + x)) << 6], 64, 0 );
          memcpyw(&CTIL[((y << 4) + x) << 6], &MENU[cur_tle][( ((Y + y + til.ypos) << 4) + (X + x)) << 6], 64, 0 );
        }
      }
    }// END IF

    memcpyw(cur_tile, &MENU[cur_tle][cur_val << 6], 64, 0 );
    MiniForm->FormPaint( NULL );
  }
  else
  {
    if ( til.w > 1 || til.h > 1 )
    {
      for ( int y = 0; y < til.h; y++ )
      { // bounds checkin
        if ( (y + Y) >= 16 ) break;
        //
        for ( int x = 0; x < til.w; x++ )
        { //
          if ( (x + X) >= 16 ) break;
//          memcpyw(&MENU[cur_tle][( ((Y + y) << 4) + (X + x)) << 6], &CTIL[((y << 4) + x) << 6], 64, 0 );
          memcpyw(&MENU[cur_tle][( ((Y + y + til.ypos) << 4) + (X + x)) << 6], &CTIL[((y << 4) + x) << 6], 64, 0 );
        }
      }
    }// END IF
    // transfer the edited tile as well
//    memcpyw(&MENU[cur_tle][((Y << 4) + X) << 6], cur_tile, 64,0 );
    memcpyw(&MENU[cur_tle][(( (Y + til.ypos) << 4) + X) << 6], cur_tile, 64,0 );
    MenuMap( TleBuf, &tile[cur_tle], 128, true );
    FormPaint( NULL );
  }
}


//////////////////////////////////
//                              //
//////////////////////////////////
void __fastcall TTileForm::FormPaint(TObject *Sender)
{
  TEMP->Width  = 128;
  TEMP->Height = 128;

  for ( int i = 0; i < 128; i++ )
    memcpyw((WORD *)TEMP->ScanLine[ i ], &TleBuf[ i << 7 ], 128,0 );
  //
  TileForm->Canvas->StretchDraw( TileForm->ClientRect, TEMP );
}


//////////////////////////////////
//                              //
//////////////////////////////////
void __fastcall TTileForm::FormMouseMove(TObject *Sender, TShiftState Shift, int X, int Y)
{
  TBOX t;
  TRect r,
        b;
  WORD TILE[64];

  TileForm->SetFocus( );


  // Expand Mouse til
  if ( KEY_DOWN(VK_CONTROL) )
  {
    t.w = til.w;
    t.h = til.h;
    //
    til.w = ((X >> 3) - til.x) + 1;
    til.h = ((Y >> 3) - til.y) + 1;
    if ( til.w <= 0 || til.h <= 0 ){
      til.w = t.w;
      til.h = t.h;
      return;
    }
    //
    FormPaint( NULL );

    r = Rect( til.x << 4 , til.y << 4, (til.x << 4) + (til.w << 4), (til.y << 4) + (til.h << 4) );
    //
    TileForm->Canvas->Brush->Color = clWhite;
    TileForm->Canvas->FrameRect( r );
    return;
  }

  // save the last position
  r = Rect( (X >> 4) << 4, (Y >> 4) << 4, ((X >> 4) << 4) + (til.w << 4), ((Y >> 4) << 4) + (til.h << 4) );

  //
  if ( KEY_DOWN(VK_LBUTTON) ) FormMouseDown(Sender, mbLeft , Shift, X, Y);
  if ( KEY_DOWN(VK_RBUTTON) ) FormMouseDown(Sender, mbRight, Shift, X, Y);

  X >>= 4;
  Y >>= 4;

  // Test for boundaries
  if ( ((X >= 16 || Y >= 16) || (X < 0 || Y < 0)) ) return;
  //
  if ( til.y != -1 && til.x != -1 )
  { //
    TEMP->Width  = til.w << 3;
    TEMP->Height = til.h << 3;
    for ( int i = 0; i < TEMP->Height; i++ )
      memcpyw((WORD *)TEMP->ScanLine[ i ], &TleBuf[(((til.y << 3)  + i) * 128) + (til.x << 3)], TEMP->Width,0 );

    b = Rect( til.x << 4, til.y << 4, (til.x << 4) + (til.w << 4), (til.y << 4) + (til.h << 4) );
    TileForm->Canvas->StretchDraw( b, TEMP );
//    TileForm->Canvas->Draw( til.x, til.y, TEMP );
  }

  //
  TileForm->Canvas->Brush->Color = clWhite;
  TileForm->Canvas->FrameRect( r );
  //
  til.y = Y;
  til.x = X;
}


//////////////////////////////////
//                              //
//////////////////////////////////
void __fastcall TTileForm::FormCreate(TObject *Sender)
{
  til.x =-1;
  til.y =-1;
  til.w = 1;
  til.h = 1;
}


//////////////////////////////////
//                              //
//////////////////////////////////
void __fastcall TTileForm::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
{
  switch( Key )
  {
    case VK_DOWN: if ( (til.ypos + 16) < 64 ) til.ypos++; break;
    case VK_UP  : if ( til.ypos ) til.ypos--; break;
    default     : Key = 0; break;
  }
  //
  if ( Key ){
    MenuMap( TleBuf, &tile[cur_tle], 128, true );
    FormPaint( NULL );
  }
}


